package cn.dong.oss.controller.admin;

import cn.dong.oss.handler.OssHandler;
import cn.dong.api.domain.CommonResult;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

@RestController
@Slf4j
@RequestMapping("/oss")
public class OssController {


    /**
     * 上传图片
     *
     * @param file
     * @return
     */
    @PostMapping("/uploadImg")
    public CommonResult uploadFile(MultipartFile file, @RequestParam(value = "dir", required = true) String dir) {
        // 上传文件
        if (file == null) {
            return CommonResult.error().message("头像上传失败，创建讲师失败");
        }

        // 文件参数
        String fileName = null;
        InputStream inputStream = null;
        // 获取流上传文件
        try {
            inputStream = file.getInputStream();
            // 增加日期，在oss创建文件时创建日期目录
            String dateTime = DateUtil.format(new Date(), "yyyy/MM/dd");
            // 文件放置重复，增加时间戳 (阿里存放讲师图片的目录+年月日时间+uuid文件名)
            fileName = dir + "/" + dateTime + "/" + IdUtil.simpleUUID() + "-" + file.getOriginalFilename();
            // 阿里oss上传文件
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(OssHandler.ENDPOINT_INFO,
                    OssHandler.ACCESS_KEY_ID_INFO, OssHandler.ACCESS_KEY_SECRET_INFO);

            // 上传文件到指定的存储空间（bucketName）并将其保存为指定的文件名称（objectName）。
            ossClient.putObject(OssHandler.BUCKET_NAME_INFO, fileName, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (IOException e) {
            log.error("上传图片失败：" + e.getMessage());
        }
        // 拼接文件的访问域名
        String path = "https://" + OssHandler.BUCKET_DOMAIN_INFO + "/" + fileName;
        return CommonResult.ok().data(path);

    }

    /**
     * 删除图片
     *
     * @param filePath 阿里存储空间的相对路径：文件夹+文件的路径
     * @return
     */
    @PostMapping("/deleteImg")
    public CommonResult delFile(String filePath) {
        if (filePath == null) {
            return CommonResult.ok();
        }
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(OssHandler.ENDPOINT_INFO,
                OssHandler.ACCESS_KEY_ID_INFO, OssHandler.ACCESS_KEY_SECRET_INFO);

        // 上传文件到指定的存储空间（bucketName）并将其保存为指定的文件名称（objectName）。
        ossClient.deleteObject(OssHandler.BUCKET_NAME_INFO, filePath);
        // 关闭OSSClient。
        ossClient.shutdown();

        return CommonResult.ok();

    }

}
